﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aga.GestionDeArchivos.Domain.Entities;
using AutoMapper;
using Aga.GestionDeArchivos.Storage;
using System.Transactions;
using Aga.GestionDeArchivos.Common;

namespace Aga.GestionDeArchivos.Services
{
    public class EstanteriaService : DomainServiceBase<Estanteria>
    {
        private EstanteriaRepository repository = RepositoryFactory.CreateEstanteriaRepository();
        protected override RepositoryBase<Estanteria> Repository
        {
            get
            {
                if (repository == null)
                    repository = RepositoryFactory.CreateEstanteriaRepository();

                return repository;
            }
        }

        public int GetNextNumber()
        {
            var estanterias = RepositoryFactory.CreateEstanteriaRepository().GetAll();

            var last = estanterias.OrderByDescending(e => e.Numero).FirstOrDefault();

            if (last == null)
                return 1;

            return last.Numero + 1;

        }

        public override Estanteria Save(Estanteria entity)
        {
            return repository.Add(entity);
        }

        public Estanteria Update(int estanteriaId, int horizontal, int vertical, int fondo)
        {
            var estanteria = RepositoryFactory.CreateEstanteriaRepository().Update(estanteriaId, horizontal, vertical, fondo);

            return estanteria;
        }

        public List<int> GetAllNumbers()
        {
            return RepositoryFactory.CreateEstanteriaRepository()
                .GetAll()
                .Select(e => e.Numero)
                .ToList();
        }

        public IQueryable<Estanteria> GetByNumber(int number)
        {
            var estanterias = RepositoryFactory.CreateEstanteriaRepository()
                .GetAll()
                .Where(e => e.Numero.Equals(number));

            return estanterias;
        }

        public PagedList<Estanteria> GetPage(IQueryable<Estanteria> allItems, int pageIndex, int pageSize)
        {
            int totalCount = allItems.Count();
            var items = allItems.OrderBy(c => c.Numero).Skip(pageIndex * pageSize).Take(pageSize).ToList();

            int pageCount = Convert.ToInt32(Math.Ceiling((double)totalCount / pageSize));

            return new PagedList<Estanteria>(items, pageIndex, pageCount, pageSize, totalCount);
        }

        public PagedList<Estanteria> GetPage(int pageIndex, int pageSize)
        {
            return GetPage(GetAll(), pageIndex, pageSize);
        }
    }
}
